package com.mlh.linkedlist;

/**
 * @author 缪林辉
 * @date 2024/8/20 21:44
 * @DESCRIPTION
 */
//给你两个 非空 的链表，表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的，并且每个节点只能存储 一位 数字。
// 请你将两个数相加，并以相同形式返回一个表示和的链表。
// 你可以假设除了数字 0 之外，这两个数都不会以 0 开头。
public class 两数相加 {
    //关键：如果两个链表的长度不同，则可以认为长度短的链表的后面有若干个 0 。
    //此外，如果链表遍历结束后，有 carry>0，还需要在答案链表的后面附加一个节点，节点的值为 carry。
    public ListNode method1(ListNode l1, ListNode l2) {
        ListNode head=null,tail=null;
        int carry =0;
        while (!(l1==null&&l2==null)){
            int v1=l1==null?0:l1.val;
            int v2=l2==null?0:l2.val;
            int sum=v1+v2+carry;
            carry=sum>9?1:0;
           if(head==null){
               head=new ListNode(sum%10);
               tail=head;
           }else{
               tail.next=new ListNode(sum%10);
               tail=tail.next;
           }
           if(l1!=null){
               l1=l1.next;
           }
           if(l2!=null){
               l2=l2.next;
           }
        }
        if(carry!=0){
            tail.next=new ListNode(carry);
        }
        return head;
    }


    public ListNode practice(ListNode l1, ListNode l2) {
        boolean flag=false;//表示进位
        ListNode pre=new ListNode(),sentry=pre;//哨兵节点
        //3中情况
        //两者都有  l1.val+l2.val
        //一边有  +0
        //两边没有  结束
        while (!(l1==null&&l2==null)){
            int v1=l1==null?0:l1.val;
            int v2=l2==null?0:l2.val;
            int sum=flag?v1+v2+1:v1+v2+0;
            if(sum>9){
                pre.next=new ListNode(sum%10);
                flag=true;
            }else{
                pre.next=new ListNode(sum);
                flag=false;
            }
            pre=pre.next;
            if(l1!=null){
                l1=l1.next;
            }
            if(l2!=null){
                l2=l2.next;
            }
        }
        //考虑最后是否进位
        if(flag){
            pre.next=new ListNode(1);
        }
        return sentry.next;
    }
}
